/**
* 
* 
*  
*====================================================
* 文件名称: SysRightServiceImpl.java
* 修订记录：
* No    日期				作者(操作:具体内容)
* 1.    2010-2-3			
*====================================================
* 类描述：(说明未实现或其它不应生成javadoc的内容)
* 
*/
package com.devframe.sysconfig.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.stereotype.Service;

import com.devframe.sysbase.model.TSysMenu;
import com.devframe.sysbase.model.TSysMenuFunc;
import com.devframe.sysbase.model.TSysOperatorLog;
import com.devframe.sysbase.model.TSysUnKnownUrl;
import com.devframe.sysbase.service.BaseService;
import com.devframe.sysconfig.service.SysRightService;

/**
 *<pre><b><font color="blue">SysRightServiceImpl</font></b></pre>
 *
 *<pre><b>&nbsp;--菜单功能权限控制--</b></pre>
 * <pre>实现功能菜单权限的缓存管理</pre>
 * <pre>
 * <b>--样例--</b>
 *   SysRightServiceImpl obj = new SysRightServiceImpl();
 *   obj.method();
 * </pre>
 * JDK版本：JDK1.4
 * @author  <b></b> 
 */
@Service(value="sysRightService")
public class SysRightServiceImpl extends BaseService implements SysRightService{

    /**
     * allMenuList
     * 菜单及功能权限缓存，用于生成菜单
     * 
     */
    private List allMenuList;
    
    /**
     * allMenuUrlList
     * 所有url对应权限的缓存，用于权限控制
     */
    private List allMenuUrlList;
    
    /**
     * allUrlMap
     * 所有URL和权限的对应关系，用于快速判断权限，
     * 如果在此处找不到则遍历allMenuUrlList，进行前端匹配模糊查找。
     * 即要求在T_SYS_MENU或者T_SYS_MENU_FUNC中配置的URL中用于权限控制的参数在最前面，且按顺序配置。
     * 如method为第一个参数
     */
    private Map allUrlMap;
    
    /**
     * allRightMap
     * 所有权限代码和权限信息对应关系
     */
    private Map allRightMap;

    
    private Set<String>urlExtraParamsNames;
    
    /**
     * unKnownUrlSet
     * 未登记url缓存，防止重复登记出错。
     */
    private Set unKnownUrlSet ;
    /**
     * 
     * 
     */
    public synchronized void init(){
        String sql ="SELECT * FROM VW_SYS_MENU ORDER BY MENU_LEVEL,SORT_NO ";
        allMenuList = this.getBaseDao().sqlQueryForList(sql);
        
        String sqlMenuUrl ="SELECT MENU_CODE FUNC_CODE,RIGHT_CODE RIGHT_CODE,PARENT_CODE,URL,MENU_CODE,MENU_NAME,TO_CHAR(IS_AJAX) IS_AJAX,TO_CHAR(NEED_LOG) NEED_LOG,TO_CHAR('0') MENU_TYPE,OPER_INFO_TMPL,TO_CHAR('1') SHOW_MENU " +
        		" FROM VW_SYS_MENU " +
        		" UNION " +
        		" SELECT MENU_CODE FUNC_CODE,MENU_CODE RIGHT_CODE,PARENT_CODE,URL,MENU_CODE,MENU_NAME,TO_CHAR(IS_AJAX) IS_AJAX,TO_CHAR(NEED_LOG) NEED_LOG,TO_CHAR('0') MENU_TYPE,OPER_INFO_TMPL,TO_CHAR(NVL(SHOW_MENU,'1')) SHOW_MENU " +
        		" FROM T_SYS_MENU " ;
        allMenuUrlList = this.getBaseDao().sqlQueryForList(sqlMenuUrl);
        
        allUrlMap = new HashMap();
        allRightMap = new HashMap();
        //对url进行处理
        /**
         * URL参数名称Map结构
         */
         Map<String,String>urlParamNameMap=new HashMap<String,String>();
         
        if(allMenuUrlList!=null){
            Iterator it = allMenuUrlList.iterator();
            while(it.hasNext()){
                Map urlMap = (Map)it.next();
                allRightMap.put(urlMap.get("FUNC_CODE"), urlMap);
                if(urlMap.get("URL")!=null){
                	String url=urlMap.get("URL").toString();
                    allUrlMap.put(urlMap.get("URL"), urlMap);
                    if(url.contains("?")){
                    	String arrayUrl[]=url.substring(url.indexOf("?")+1).split("&");
                    	if(arrayUrl!=null){
                       	 	for(String item:arrayUrl){
                       	 	String key=item.substring(0,item.indexOf("="));
                       	 		urlParamNameMap.put(key, key);
                    	 	}
                    	}
                    }
                }
            }
        }
        logger.info("URL扩展参数："+urlParamNameMap);
        this.urlExtraParamsNames=urlParamNameMap.keySet();
        unKnownUrlSet = new HashSet();
        //未知url
        String sqlUnKnownUrl = "select a.url from TSysUnKnownUrl a ";
        List unKnownUrlList = this.getBaseDao().queryForList(sqlUnKnownUrl);
        unKnownUrlSet.addAll(unKnownUrlList);
    }
    /**
     * @return List
     * 
     */
    public List getAllMenuList() {
        if(allMenuList==null){
            init();
        }
        return allMenuList;
    }
    
    /**
     * @return List
     * 
     */
    public List getAllMenuUrlList() {
        if(allMenuUrlList==null){
            init();
        }
        return allMenuUrlList;
    }
    
    /**
     * 获取URL对应的权限代码，
     * 没有登记的URL自动记录到T_SYS_MENU_FUNC中，返回NULL
     * 有登记的则返回对应的MENU_CODE
     * @param url url
     * @return urlMap(URL,MENU_CODE,MENU_NAME)
     * 
     */
    public Map getUrlMenu(String url){
        if(allUrlMap==null){
            init();
        }
        Map urlMap = (Map)allUrlMap.get(url);
        if(urlMap==null && allMenuUrlList!=null){
            Iterator it = allMenuUrlList.iterator();
            while(it.hasNext()){
                urlMap = (Map)it.next();
                String menuUrl = (String)urlMap.get("URL");
                //如果传入的URL没有其他参数，则只查找显示菜单。
                if(menuUrl!=null && menuUrl.startsWith(url) && (url.contains("?") || urlMap.get("SHOW_MENU").equals("1"))){
                    synchronized(allUrlMap){
                        allUrlMap.put(url, urlMap);
                    }
                    break;
                } else {
                    urlMap = null;
                }
            }
        }

        return urlMap;
    }
    /**
     * 
     * getMenu
     * @param menuCode 菜单代码
     * @return TSysMenu
     * 
     */
    public TSysMenu getMenu(String menuCode){
        return (TSysMenu)getBaseDao().get(TSysMenu.class, menuCode);
    }
    
    /**
     * getSysRightInfo
     * 获取权限信息，暂且先用MAP返回。
     * @param rightCode 权限代码
     * @return 权限信息
     * 
     */
    public Map getSysRightInfo(String rightCode){
        return (Map) allRightMap.get(rightCode);
    }
    /**
     * createUnKnownUrl
     * 记录未登记的URL
     * @param url url
     * 
     */
    public synchronized void createUnKnownUrl(String url){
        try {
            if(!unKnownUrlSet.contains(url)){
                unKnownUrlSet.add(url);
                TSysUnKnownUrl unKnownUrl = (TSysUnKnownUrl)getBaseDao().get(TSysUnKnownUrl.class, url);
                if(unKnownUrl==null){
                    unKnownUrl = new TSysUnKnownUrl(url);
                    getBaseDao().save(unKnownUrl);
                }
            }
        } catch (Exception e) {
            logger.info(url);
        }
    }
    
    /**
     * saveSysOperatorLog
     * @param opLog TSysOperatorLog
     * 
     */
    public void saveSysOperatorLog(TSysOperatorLog opLog){
        getBaseDao().save(opLog);
    }
    
    /**
     * getMenu
     * 查询单个功能对象
     * @param funcCode 功能代码
     * @return TSysMenuFunc
     * 
     */
    public TSysMenuFunc getMenuFunc(String funcCode){
        return (TSysMenuFunc)getBaseDao().get(TSysMenuFunc.class, funcCode);
    }
	public Set<String> getUrlExtraParamsNames() {
		return this.urlExtraParamsNames;
	}
 
    

}
